[Mysql] mysql切割慢日志


本文总阅读量

0、去查看一个测试库的慢日志文件发现有11g的大小,根本没有办法使用mysqldumpslow去查询,因此想要先对日志进行切割:

1
2
3
4
5
split几个主要参数:
-b 分割后的文档大小,单位是byte
-C 分割后的文档,单行最大byte数
-d 使用数字作为后缀,同时使用-a length指定后缀长度
-l 分割后文档的行数

1、使用split,按大小切割日志文件,每个文件1G大小,切割后的文件名前缀为test.log,不指定后缀会使用默认后缀名aa,ab,ac….等

split slow.log -b 1G test.log

1
2
3
4
5
6
7
8
9
10
11
12
ls -ltrh test.log*
-rw-r--r-- 1 root root 1.0G Sep 12 03:08 test.logaa
-rw-r--r-- 1 root root 1.0G Sep 12 03:09 test.logab
-rw-r--r-- 1 root root 1.0G Sep 12 03:10 test.logac
-rw-r--r-- 1 root root 1.0G Sep 12 03:11 test.logad
-rw-r--r-- 1 root root 1.0G Sep 12 03:12 test.logae
-rw-r--r-- 1 root root 1.0G Sep 12 03:13 test.logaf
-rw-r--r-- 1 root root 1.0G Sep 12 03:14 test.logag
-rw-r--r-- 1 root root 1.0G Sep 12 03:15 test.logah
-rw-r--r-- 1 root root 1.0G Sep 12 03:16 test.logai
-rw-r--r-- 1 root root 1.0G Sep 12 03:17 test.logaj
-rw-r--r-- 1 root root 270M Sep 12 03:17 test.logak

2、如果需要指定后缀可使用-d -a 参数(n)代表指定附加后缀的个数,比如切割test.logaa日志文件:

split test.logaa -b 100M -d -a 2 logaa

1
2
3
4
5
6
7
8
9
10
11
12
 ll logaa*
-rw-r--r-- 1 root root 100M Sep 12 09:03 logaa00
-rw-r--r-- 1 root root 100M Sep 12 09:03 logaa01
-rw-r--r-- 1 root root 100M Sep 12 09:03 logaa02
-rw-r--r-- 1 root root 100M Sep 12 09:03 logaa03
-rw-r--r-- 1 root root 100M Sep 12 09:03 logaa04
-rw-r--r-- 1 root root 100M Sep 12 09:03 logaa05
-rw-r--r-- 1 root root 100M Sep 12 09:03 logaa06
-rw-r--r-- 1 root root 100M Sep 12 09:03 logaa07
-rw-r--r-- 1 root root 100M Sep 12 09:03 logaa08
-rw-r--r-- 1 root root 100M Sep 12 09:04 logaa09
-rw-r--r-- 1 root root 24M Sep 12 09:04 logaa10

split test.logab -b 100M -d -a 4 logab

1
2
3
4
5
6
7
8
9
10
11
12
ls -ltrh logab*
-rw-r--r-- 1 root root 100M Sep 12 09:05 logab0000
-rw-r--r-- 1 root root 100M Sep 12 09:05 logab0001
-rw-r--r-- 1 root root 100M Sep 12 09:05 logab0002
-rw-r--r-- 1 root root 100M Sep 12 09:05 logab0003
-rw-r--r-- 1 root root 100M Sep 12 09:05 logab0004
-rw-r--r-- 1 root root 100M Sep 12 09:05 logab0005
-rw-r--r-- 1 root root 100M Sep 12 09:05 logab0006
-rw-r--r-- 1 root root 100M Sep 12 09:05 logab0007
-rw-r--r-- 1 root root 100M Sep 12 09:06 logab0008
-rw-r--r-- 1 root root 100M Sep 12 09:06 logab0009
-rw-r--r-- 1 root root 24M Sep 12 09:06 logab0010

4、按行切割日志文件,查看准备切割的文件有多少行:

1
2
cat logab0001 |wc -l
505

按每个文件60行切割
split logab0001 -l 60 logab0001

1
2
3
4
5
6
7
8
9
10
11
ll logab0001*
-rw-r--r-- 1 root root 104857600 Sep 12 09:05 logab0001
-rw-r--r-- 1 root root 11922880 Sep 12 09:10 logab0001aa
-rw-r--r-- 1 root root 12506422 Sep 12 09:10 logab0001ab
-rw-r--r-- 1 root root 12506026 Sep 12 09:10 logab0001ac
-rw-r--r-- 1 root root 12506635 Sep 12 09:10 logab0001ad
-rw-r--r-- 1 root root 12506065 Sep 12 09:10 logab0001ae
-rw-r--r-- 1 root root 12506313 Sep 12 09:10 logab0001af
-rw-r--r-- 1 root root 12506206 Sep 12 09:10 logab0001ag
-rw-r--r-- 1 root root 12506325 Sep 12 09:10 logab0001ah
-rw-r--r-- 1 root root 5390728 Sep 12 09:10 logab0001ai

查看每个文件的行数

1
2
3
4
5
6
7
8
9
10
11
for i in `ls logab0001*`;do echo "$i文件行数"`cat $i|wc -l` ;done 
logab0001文件行数505
logab0001aa文件行数60
logab0001ab文件行数60
logab0001ac文件行数60
logab0001ad文件行数60
logab0001ae文件行数60
logab0001af文件行数60
logab0001ag文件行数60
logab0001ah文件行数60
logab0001ai文件行数25

5、按每行字节数切割

指定每行字节数最多不超过2000000个字节
split logab0001aa -C 2000000 testlog

1
2
3
4
5
6
7
8
9
10
11
12
ls -lthr testlog*
-rw-r--r-- 1 root root 1.5M Sep 12 10:19 testlogaa
-rw-r--r-- 1 root root 1018K Sep 12 10:19 testlogab
-rw-r--r-- 1 root root 1018K Sep 12 10:19 testlogac
-rw-r--r-- 1 root root 1018K Sep 12 10:19 testlogad
-rw-r--r-- 1 root root 1018K Sep 12 10:19 testlogae
-rw-r--r-- 1 root root 1018K Sep 12 10:19 testlogaf
-rw-r--r-- 1 root root 1018K Sep 12 10:19 testlogag
-rw-r--r-- 1 root root 1018K Sep 12 10:19 testlogah
-rw-r--r-- 1 root root 1018K Sep 12 10:19 testlogai
-rw-r--r-- 1 root root 1018K Sep 12 10:19 testlogaj
-rw-r--r-- 1 root root 1018K Sep 12 10:19 testlogak

查看某一行的字节数

1
2
[root@dax-mysql-slave log]# sed '1p' testlogaa|wc -c
1960374

字节数小于2000000

1
rm -rf testlog*

删除生成的日志文件,生成每行字节最大不超过1500000的日志文件:
split logab0001aa -C 1500000 testlog

1
2
3
4
5
6
7
8
9
10
11
12
13
ls -lthr testlog*
-rw-r--r-- 1 root root 449K Sep 12 10:22 testlogaa
-rw-r--r-- 1 root root 1018K Sep 12 10:22 testlogab
-rw-r--r-- 1 root root 1018K Sep 12 10:22 testlogac
-rw-r--r-- 1 root root 1018K Sep 12 10:22 testlogad
-rw-r--r-- 1 root root 1018K Sep 12 10:22 testlogae
-rw-r--r-- 1 root root 1018K Sep 12 10:22 testlogaf
-rw-r--r-- 1 root root 1018K Sep 12 10:22 testlogag
-rw-r--r-- 1 root root 1018K Sep 12 10:22 testlogah
-rw-r--r-- 1 root root 1018K Sep 12 10:22 testlogai
-rw-r--r-- 1 root root 1018K Sep 12 10:22 testlogaj
-rw-r--r-- 1 root root 1018K Sep 12 10:22 testlogak
-rw-r--r-- 1 root root 1018K Sep 12 10:22 testlogal

查看某一行的字节数

1
2
[root@dax-mysql-slave log]# sed '1p' testlogaa|wc -c
918219

字节数小于1500000

6、上面产生11g的慢日志文件主要是由于日志没有定期切割造成的,因此写了个脚本,定期对慢日志进行切割:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash
#mysql慢日志所在路径
slowlogpath=/data/mysql/log
#mysql慢日志文件名
slowlogname=slow.log
#当前系统时间
stamp=`date +'%Y%m%d'`
#与当前系统时间对比,七天前的时间
oldstamp=`date +"%Y%m%d" -d "-7 day"`
#mysql用户名
username=root
#mysql用户名密码
password=12345678
#mysql安装路径
dbpath=/data/mysql/bin
#移动mysql慢日志
mv ${slowlogpath}/${slowlogname} ${slowlogpath}/${stamp}_${slowlogname}
#重新生成slow日志文件:
${dbpath}/mysqladmin -u ${username} -p${password} flush-logs slow
#删除7天前的日志文件
if [ -e ${slowlogpath}/${oldstamp}_${slowlogname} ];then
sudo rm -rf ${slowlogpath}/${oldstamp}_${slowlogname}
else
:
fi

将脚本添加到定时任务:
crontab -l

1
0 1 * * * sh /data/script/split_mysqlslowlog.sh
目录
  1. 1. 0、去查看一个测试库的慢日志文件发现有11g的大小,根本没有办法使用mysqldumpslow去查询,因此想要先对日志进行切割:
  2. 2. 1、使用split,按大小切割日志文件,每个文件1G大小,切割后的文件名前缀为test.log,不指定后缀会使用默认后缀名aa,ab,ac….等
  3. 3. 2、如果需要指定后缀可使用-d -a 参数(n)代表指定附加后缀的个数,比如切割test.logaa日志文件:
  4. 4. 4、按行切割日志文件,查看准备切割的文件有多少行:
  5. 5. 5、按每行字节数切割
  6. 6. 6、上面产生11g的慢日志文件主要是由于日志没有定期切割造成的,因此写了个脚本,定期对慢日志进行切割:

Proudly powered by Hexo and Theme by Lap
本站访客数人次
© 2020 zeven0707's blog